using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using database;
using objetos;
using System.IO;
using System.Xml.Serialization;

namespace dados
{
	#region TB_ORCAMENTO
	/// <summary>
	/// This object represents the properties and methods of a TB_ORCAMENTO.
	/// </summary>
	public class DAL_TB_ORCAMENTO
	{		
	
		/// <summary>
		/// Incluir via aplicacao
		/// </summary>	
        public int Incluir(OBJ_TB_ORCAMENTO obj)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                DataSet ds = new DataSet();
                List<string> lista = new List<string>();

                db.CreateParameter("@id_empresa", SqlDbType.Int, obj.id_empresa);
                lista.Add("@id_empresa");
                db.CreateParameter("@id_cadastro", SqlDbType.Int, obj.id_cadastro);
                lista.Add("@id_cadastro");
                db.CreateParameter("@id_forma_pagamento", SqlDbType.Int, obj.id_forma_pagamento);
                lista.Add("@id_forma_pagamento");
                db.CreateParameter("@id_condicao_pagamento", SqlDbType.Int, obj.id_condicao_pagamento);
                lista.Add("@id_condicao_pagamento");
                db.CreateParameter("@dt_emissao", SqlDbType.DateTime, obj.dt_emissao);
                lista.Add("@dt_emissao");
                db.CreateParameter("@dt_entrega", SqlDbType.DateTime, obj.dt_entrega);
                lista.Add("@dt_entrega");
                db.CreateParameter("@dt_aprovacao", SqlDbType.DateTime, obj.dt_aprovacao);
                lista.Add("@dt_aprovacao");
                db.CreateParameter("@dt_validade", SqlDbType.DateTime, obj.dt_validade);
                lista.Add("@dt_validade");
                db.CreateParameter("@hora_emissao", SqlDbType.DateTime, obj.hora_emissao);
                lista.Add("@hora_emissao");
                db.CreateParameter("@id_situacao_orcamento", SqlDbType.Int, obj.id_situacao_orcamento);
                lista.Add("@id_situacao_orcamento");
                db.CreateParameter("@id_operacao", SqlDbType.Int, obj.id_operacao);
                lista.Add("@id_operacao");
                db.CreateParameter("@veiculo_placa", SqlDbType.VarChar, obj.veiculo_placa);
                lista.Add("@veiculo_placa");
                db.CreateParameter("@veiculo_km", SqlDbType.VarChar, obj.veiculo_km);
                lista.Add("@veiculo_km");
                db.CreateParameter("@observacao", SqlDbType.Text, obj.observacao);
                lista.Add("@observacao");
                db.CreateParameter("@informacao_adicional", SqlDbType.Text, obj.informacao_adicional);
                lista.Add("@informacao_adicional");
                db.CreateParameter("@valor_total_servico", SqlDbType.Decimal, obj.valor_total_servico);
                lista.Add("@valor_total_servico");
                db.CreateParameter("@valor_total_produto", SqlDbType.Decimal, obj.valor_total_produto);
                lista.Add("@valor_total_produto");
                db.CreateParameter("@valor_total_desconto", SqlDbType.Decimal, obj.valor_total_desconto);
                lista.Add("@valor_total_desconto");
                db.CreateParameter("@valor_total_outro", SqlDbType.Decimal, obj.valor_total_outro);
                lista.Add("@valor_total_outro");
                db.CreateParameter("@valor_total_orcamento", SqlDbType.Decimal, obj.valor_total_orcamento);
                lista.Add("@valor_total_orcamento");
                db.CreateParameter("@id_usuario_criador", SqlDbType.Int, obj.id_usuario_criador);
                lista.Add("@id_usuario_criador");
                db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);
                lista.Add("@id_usuario_checkin");
                db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);
                lista.Add("@dt_checkin");

                string query = String.Format("Insert Into tb_orcamento ({0}) Values ({1}); SELECT SCOPE_IDENTITY()", string.Join(",", lista.ToArray()).ToString().Replace("@", ""), string.Join(",", lista.ToArray()).ToString());
                ds = db.ExecuteQuery(query);

                return Convert.ToInt32(ds.Tables[0].Rows[0][0].ToString());
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void AtualizaTotalOrcamento(OBJ_TB_ORCAMENTO obj)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            List<string> lista = new List<string>();

            db.CreateParameter("@valor_total_servico", SqlDbType.Decimal, obj.valor_total_servico);
            lista.Add("valor_total_servico = @valor_total_servico");
            db.CreateParameter("@valor_total_produto", SqlDbType.Decimal, obj.valor_total_produto);
            lista.Add("valor_total_produto = @valor_total_produto");
            db.CreateParameter("@valor_total_desconto", SqlDbType.Decimal, obj.valor_total_desconto);
            lista.Add("valor_total_desconto = @valor_total_desconto");
            db.CreateParameter("@valor_total_outro", SqlDbType.Decimal, obj.valor_total_outro);
            lista.Add("valor_total_outro = @valor_total_outro");
            db.CreateParameter("@valor_total_orcamento", SqlDbType.Decimal, obj.valor_total_orcamento);
            lista.Add("valor_total_orcamento = @valor_total_orcamento");

            db.CreateParameter("@id", SqlDbType.Int, obj.id);

            string query = String.Format("Update TB_ORCAMENTO Set {0} Where id = @id", string.Join(",", lista.ToArray()).ToString());
            db.ExecuteQuery(query);

        }

		/// <summary>
		/// Update via aplicacao
		/// </summary>			
        public void Alterar(OBJ_TB_ORCAMENTO obj)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                List<string> lista = new List<string>();

                db.CreateParameter("@id", SqlDbType.Int, obj.id);


                db.CreateParameter("@id_empresa", SqlDbType.Int, obj.id_empresa);
                lista.Add("id_empresa = @id_empresa");
                db.CreateParameter("@id_cadastro", SqlDbType.Int, obj.id_cadastro);
                lista.Add("id_cadastro = @id_cadastro");
                db.CreateParameter("@id_forma_pagamento", SqlDbType.Int, obj.id_forma_pagamento);
                lista.Add("id_forma_pagamento = @id_forma_pagamento");
                db.CreateParameter("@id_condicao_pagamento", SqlDbType.Int, obj.id_condicao_pagamento);
                lista.Add("id_condicao_pagamento = @id_condicao_pagamento");
                db.CreateParameter("@dt_emissao", SqlDbType.DateTime, obj.dt_emissao);
                lista.Add("dt_emissao = @dt_emissao");
                db.CreateParameter("@dt_entrega", SqlDbType.DateTime, obj.dt_entrega);
                lista.Add("dt_entrega = @dt_entrega");
                db.CreateParameter("@dt_aprovacao", SqlDbType.DateTime, obj.dt_aprovacao);
                lista.Add("dt_aprovacao = @dt_aprovacao");
                db.CreateParameter("@dt_validade", SqlDbType.DateTime, obj.dt_validade);
                lista.Add("dt_validade = @dt_validade");
                db.CreateParameter("@hora_emissao", SqlDbType.DateTime, obj.hora_emissao);
                lista.Add("hora_emissao = @hora_emissao");
                db.CreateParameter("@id_situacao_orcamento", SqlDbType.Int, obj.id_situacao_orcamento);
                lista.Add("id_situacao_orcamento = @id_situacao_orcamento");
                db.CreateParameter("@id_operacao", SqlDbType.Int, obj.id_operacao);
                lista.Add("id_operacao = @id_operacao");
                db.CreateParameter("@veiculo_placa", SqlDbType.VarChar, obj.veiculo_placa);
                lista.Add("veiculo_placa = @veiculo_placa");
                db.CreateParameter("@veiculo_km", SqlDbType.VarChar, obj.veiculo_km);
                lista.Add("veiculo_km = @veiculo_km");
                db.CreateParameter("@observacao", SqlDbType.Text, obj.observacao);
                lista.Add("observacao = @observacao");
                db.CreateParameter("@informacao_adicional", SqlDbType.Text, obj.informacao_adicional);
                lista.Add("informacao_adicional = @informacao_adicional");
                db.CreateParameter("@valor_total_servico", SqlDbType.Decimal, obj.valor_total_servico);
                lista.Add("valor_total_servico = @valor_total_servico");
                db.CreateParameter("@valor_total_produto", SqlDbType.Decimal, obj.valor_total_produto);
                lista.Add("valor_total_produto = @valor_total_produto");
                db.CreateParameter("@valor_total_desconto", SqlDbType.Decimal, obj.valor_total_desconto);
                lista.Add("valor_total_desconto = @valor_total_desconto");
                db.CreateParameter("@valor_total_outro", SqlDbType.Decimal, obj.valor_total_outro);
                lista.Add("valor_total_outro = @valor_total_outro");
                db.CreateParameter("@valor_total_orcamento", SqlDbType.Decimal, obj.valor_total_orcamento);
                lista.Add("valor_total_orcamento = @valor_total_orcamento");
                db.CreateParameter("@id_usuario_criador", SqlDbType.Int, obj.id_usuario_criador);
                lista.Add("id_usuario_criador = @id_usuario_criador");
                db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);
                lista.Add("id_usuario_checkin = @id_usuario_checkin");
                db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);
                lista.Add("dt_checkin = @dt_checkin");

                string query = String.Format("Update TB_ORCAMENTO Set {0} Where id = @id", string.Join(",", lista.ToArray()).ToString());
                db.ExecuteQuery(query);
            }
            catch (Exception)
            {
                throw;
            }
        }	
		
		/// <summary>
		/// Delete viaaplicacao
		/// </summary>	
		public void Excluir(OBJ_TB_ORCAMENTO obj)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				StringBuilder queryParameters = new StringBuilder();
				db.CreateParameter("@id", SqlDbType.Int, obj.id);
		
				string query = "Delete tb_orcamento Where id = @id";			
				db.ExecuteQuery(query);
			}
			catch (Exception)
       		{
            	throw;
        	}
		}

      

        public bool EstaBloqueado(int id)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                DataSet ds = new DataSet();
                StringBuilder queryParameters = new StringBuilder();
                db.CreateParameter("@id", SqlDbType.Int, id);

                string query = "SELECT Count(id_usuario_checkin) from tb_orcamento WHERE id = @id";
                ds = db.ExecuteQuery(query);

                if (!db.DataSetIsEmpty(ds))
                {
                    return true;
                }
                else
                {
                    return false;
                }


            }
            catch (Exception)
            {
                
                throw;
            }
        }


        /// <summary>
        /// Bloquear
        /// </summary>	
        public void Bloquear(OBJ_TB_ORCAMENTO obj)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                StringBuilder queryParameters = new StringBuilder();
                db.CreateParameter("@id", SqlDbType.Int, obj.id);
                db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);
                db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);

                string query = "UPDATE tb_orcamento SET id_usuario_checkin = @id_usuario_checkin, dt_checkin = @dt_checkin Where id = @id";
                db.ExecuteQuery(query);
            }
            catch (Exception)
            {

                throw;
            }
        }


        /// <summary>
        /// Liberar
        /// </summary>	
        public void Liberar(OBJ_TB_ORCAMENTO obj)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                StringBuilder queryParameters = new StringBuilder();
                db.CreateParameter("@id", SqlDbType.Int, obj.id);
                db.CreateParameter("@id_usuario_checkin", SqlDbType.Int, obj.id_usuario_checkin);
                db.CreateParameter("@dt_checkin", SqlDbType.DateTime, obj.dt_checkin);

                string query = "UPDATE tb_orcamento SET id_usuario_checkin = @id_usuario_checkin, dt_checkin = @dt_checkin Where id = @id";
                db.ExecuteQuery(query);
            }
            catch (Exception)
            {

                throw;
            }
        }



        /// <summary>
        /// Cancelar
        /// </summary>	
        public void Cancelar(OBJ_TB_ORCAMENTO obj)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                StringBuilder queryParameters = new StringBuilder();
                db.CreateParameter("@id", SqlDbType.Int, obj.id);

                db.CreateParameter("@id_situacao_orcamento", SqlDbType.Int, obj.id_situacao_orcamento);

                string query = "UPDATE tb_orcamento SET id_situacao_orcamento = @id_situacao_orcamento Where id = @id";
                db.ExecuteQuery(query);
            }
            catch (Exception)
            {
                
                throw;
            }
        }
	


	
		/// <summary>
		/// Lista objeto
		/// </summary>						
		public List<OBJ_TB_ORCAMENTO> SelecionarLista()
    	{
        	try
        	{
				DAO_DATABASE db = new DAO_DATABASE();
				List<OBJ_TB_ORCAMENTO> lista = new List<OBJ_TB_ORCAMENTO>();
				OBJ_TB_ORCAMENTO obj = null;
				DataTable dt = new DataTable();
				DataSet ds = new DataSet();
				StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
                sb.Append(" tb_orcamento.dt_emissao, tb_orcamento.dt_entrega, tb_orcamento.dt_aprovacao, tb_orcamento.dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
                sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
                sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,   tb_orcamento.valor_total_orcamento,  ");
                sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
                sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.nome AS nome_empresa, tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento ");
                sb.Append(" FROM         tb_orcamento INNER JOIN ");
                sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
                sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
                sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
                sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
                sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
                sb.Append("  tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");
        
	            ds = db.ExecuteQuery(sb.ToString());
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					
					foreach (DataRow dr in dt.Rows)
					{											
						obj = new OBJ_TB_ORCAMENTO();
						Set(obj,dr);
						lista.Add(obj);
		
					}
				}
				return lista;
        	}
        	catch (Exception)
       		{
            	throw;
        	}

    	}
		
		/// <summary>
		/// Set Objeto
		/// </summary>	
		private void Set(OBJ_TB_ORCAMENTO obj,DataRow dr)
		{
			obj.id = Convert.ToInt32(dr["id"]);						
			obj.id_empresa = Convert.ToInt32(dr["id_empresa"].ToString()) ;	
			obj.id_cadastro = Convert.ToInt32(dr["id_cadastro"].ToString()) ;	
			obj.id_forma_pagamento = Convert.ToInt32(dr["id_forma_pagamento"].ToString()) ;	
			obj.id_condicao_pagamento = Convert.ToInt32(dr["id_condicao_pagamento"].ToString()) ;	
			obj.dt_emissao = dr["dt_emissao"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_emissao"].ToString()) ;						
			obj.dt_entrega = dr["dt_entrega"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_entrega"].ToString()) ;						
			obj.dt_aprovacao = dr["dt_aprovacao"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_aprovacao"].ToString()) ;						
			obj.dt_validade = dr["dt_validade"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_validade"].ToString()) ;						
			obj.hora_emissao = dr["hora_emissao"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["hora_emissao"].ToString()) ;						
			obj.id_situacao_orcamento = Convert.ToInt32(dr["id_situacao_orcamento"].ToString()) ;	
			obj.id_operacao = Convert.ToInt32(dr["id_operacao"].ToString()) ;	
			obj.observacao = dr["observacao"] == DBNull.Value ?  string.Empty : dr["observacao"].ToString() ;
			obj.informacao_adicional = dr["informacao_adicional"] == DBNull.Value ?  string.Empty : dr["informacao_adicional"].ToString() ;
			obj.valor_total_servico = dr["valor_total_servico"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_total_servico"].ToString()) ;
			obj.valor_total_produto = dr["valor_total_produto"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_total_produto"].ToString()) ;
			obj.valor_total_desconto = dr["valor_total_desconto"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_total_desconto"].ToString()) ;
			obj.valor_total_outro = dr["valor_total_outro"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_total_outro"].ToString()) ;          
			obj.valor_total_orcamento = dr["valor_total_orcamento"] == DBNull.Value ?  0 : Convert.ToDecimal(dr["valor_total_orcamento"].ToString()) ;
            obj.id_usuario_checkin = dr["id_usuario_checkin"] == DBNull.Value ? (int?)null : Convert.ToInt32(dr["id_usuario_checkin"].ToString());
	        obj.id_usuario_criador = dr["id_usuario_criador"] == DBNull.Value ? (int?)null :  Convert.ToInt32(dr["id_usuario_criador"].ToString());
			obj.dt_checkin = dr["dt_checkin"] == DBNull.Value ? (DateTime?)null :  Convert.ToDateTime(dr["dt_checkin"].ToString()) ;
            obj.Tb_cadastro.nome = dr["nome_cliente_fornecedor"] == DBNull.Value ? string.Empty : dr["nome_cliente_fornecedor"].ToString();
            obj.Tb_condicao_pagamento.desc_condicao_pagamento = dr["desc_condicao_pagamento"] == DBNull.Value ? string.Empty : dr["desc_condicao_pagamento"].ToString();
            obj.Tb_empresa.nome = dr["nome_empresa"] == DBNull.Value ? string.Empty : dr["nome_empresa"].ToString();
            obj.Tb_forma_pagamento.desc_forma_pagamento = dr["desc_forma_pagamento"] == DBNull.Value ? string.Empty : dr["desc_forma_pagamento"].ToString();
            obj.Tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento = dr["desc_tipo_sit_orcamento"] == DBNull.Value ? string.Empty : dr["desc_tipo_sit_orcamento"].ToString();
            
		}						
				
		/// <summary>
		/// Selecionar Objeto Por ID
		/// </summary>	
		public OBJ_TB_ORCAMENTO SelecionarObjetoPorId(int id)
		{
			try
			{
				DAO_DATABASE db = new DAO_DATABASE();
				OBJ_TB_ORCAMENTO obj = new OBJ_TB_ORCAMENTO();
				DataSet ds = new DataSet();				
				DataTable dt = new DataTable();
				db.CreateParameter("@id", SqlDbType.Int, id);

                StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
                sb.Append(" CONVERT(DATE,tb_orcamento.dt_emissao,103) as dt_emissao, CONVERT(DATE,tb_orcamento.dt_entrega,103) as dt_entrega, CONVERT(DATE,tb_orcamento.dt_aprovacao,103) as dt_aprovacao, CONVERT(DATE,tb_orcamento.dt_validade,103) as dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
                sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
                sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
                sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
                sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.cnpj, tb_empresa.nome AS nome_empresa, tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento");
                sb.Append(" FROM         tb_orcamento INNER JOIN ");
                sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
                sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
                sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
                sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
                sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
                sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");
                sb.Append(" WHERE tb_orcamento.id = @id");
				ds = db.ExecuteQuery(sb.ToString());				
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					
					foreach (DataRow dr in dt.Rows)
                	{
						obj = new OBJ_TB_ORCAMENTO();
						Set(obj,dr);																			
					}
					return obj;
					
				}
				else
				{
					return null;	
				}			
			}
			catch (Exception)
       		{
            	throw;
        	}
			
		}


        /// <summary>
        /// Selecionar Objeto Por ID
        /// </summary>	
        public OBJ_TB_ORCAMENTO SelecionarObjetoPorId(int id, int id_operacao)
        {
            try
            {
                DAO_DATABASE db = new DAO_DATABASE();
                OBJ_TB_ORCAMENTO obj = new OBJ_TB_ORCAMENTO();
                DataSet ds = new DataSet();
                DataTable dt = new DataTable();
                db.CreateParameter("@id", SqlDbType.Int, id);
                db.CreateParameter("@id_operacao", SqlDbType.Int, id_operacao);

                StringBuilder sb = new StringBuilder();
                sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
                sb.Append(" CONVERT(DATE,tb_orcamento.dt_emissao,103) as dt_emissao, CONVERT(DATE,tb_orcamento.dt_entrega,103) as dt_entrega, CONVERT(DATE,tb_orcamento.dt_aprovacao,103) as dt_aprovacao, CONVERT(DATE,tb_orcamento.dt_validade,103) as dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
                sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
                sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
                sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
                sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.cnpj, tb_empresa.nome AS nome_empresa, tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento ");
                sb.Append(" FROM         tb_orcamento INNER JOIN ");
                sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
                sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
                sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
                sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
                sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
                sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");
                sb.Append(" WHERE tb_orcamento.id = @id and ");
                ds = db.ExecuteQuery(sb.ToString());

                if (!db.DataSetIsEmpty(ds))
                {
                    dt = ds.Tables[0];

                    foreach (DataRow dr in dt.Rows)
                    {
                        obj = new OBJ_TB_ORCAMENTO();
                        Set(obj, dr);
                    }
                    return obj;

                }
                else
                {
                    return null;
                }
            }
            catch (Exception)
            {
                throw;
            }

        }
		
		
		/// <summary>
		/// Lista objeto Parametro Where OrderBy
		/// </summary>							
		public List<OBJ_TB_ORCAMENTO> SelecionarLista(String Where, String OrderBy)
    	{
        	try
        	{
				DAO_DATABASE db = new DAO_DATABASE();
				OBJ_TB_ORCAMENTO obj = null;
				DataSet ds = new DataSet();
				DataTable dt = new DataTable();
				List<OBJ_TB_ORCAMENTO> lista = new List<OBJ_TB_ORCAMENTO>();
				
				StringBuilder sb = new StringBuilder();
				db.CreateParameter("@Where",SqlDbType.VarChar, Where );
				db.CreateParameter("@OrderBy", SqlDbType.VarChar, OrderBy );
                sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
                sb.Append(" tb_orcamento.dt_emissao, tb_orcamento.dt_entrega, tb_orcamento.dt_aprovacao, tb_orcamento.dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
                sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
                sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
                sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
                sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.nome AS nome_empresa , tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento");
                sb.Append(" FROM         tb_orcamento INNER JOIN ");
                sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
                sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
                sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
                sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
                sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
                sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");
                
                if (Where != string.Empty)				
				sb.Append(string.Format(" Where {0} ",Where));
				if(OrderBy != string.Empty)
				sb.Append(string.Format(" Order by {0}",OrderBy));
				
				ds = db.ExecuteQuery(sb.ToString());
				
				if(!db.DataSetIsEmpty(ds))
				{
					dt = ds.Tables[0];
					foreach (DataRow dr in dt.Rows)
					{						
						obj = new OBJ_TB_ORCAMENTO();
						Set(obj,dr);			
						lista.Add(obj);
					}
				}
				return lista;
        	}
        	catch (Exception)
       		{
            	throw;
        	}

    	}

		
		public DataSet Selecionar(String Where, String OrderBy, int PageIndex, int PageSize )
		{
				DAO_DATABASE db = new DAO_DATABASE();
				DataSet ds = new DataSet();
				
				StringBuilder sb = new StringBuilder();
				
				PageIndex = PageSize * PageIndex;
            	PageSize =  PageIndex + PageSize;
				
		      	if (OrderBy == string.Empty) OrderBy = "tb_orcamento.id";

            	sb.Append("SELECT * FROM ");
            	sb.Append(string.Format(" (SELECT ROW_NUMBER() OVER (ORDER BY {0}) AS RowNumber,",OrderBy));
                sb.Append(" tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
                sb.Append(" tb_orcamento.dt_emissao, tb_orcamento.dt_entrega, tb_orcamento.dt_aprovacao, tb_orcamento.dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
                sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
                sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
                sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
                sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.nome AS nome_empresa, tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento  ");
                sb.Append(" FROM         tb_orcamento INNER JOIN ");
                sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
                sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
                sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
                sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
                sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
                sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");

				if (Where != string.Empty)
				{
					sb.Append(string.Format(" WHERE {0}", Where));
				}
				sb.Append(" ) query  ");
				sb.Append(string.Format(" WHERE RowNumber BETWEEN {0} + 1 and {1}; ",PageIndex,PageSize));

            	sb.Append("SELECT count(*) FROM tb_orcamento");
				if (Where != string.Empty)
				{
					sb.Append(string.Format(" WHERE {0}", Where));
				}
				ds = db.ExecuteQuery(sb.ToString());
				
				if (!db.DataSetIsEmpty(ds))
            	{
                publico.PUB_PAGINACAO.CalcularTotalDePaginas(Convert.ToDecimal(ds.Tables[1].Rows[0][0].ToString()));
            	}

				
            	return ds;
								
		}
				
								
		public DataSet Selecionar(String Where, String OrderBy)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();

            sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.id_condicao_pagamento, ");
            sb.Append(" tb_orcamento.dt_emissao, tb_orcamento.dt_entrega, tb_orcamento.dt_aprovacao, tb_orcamento.dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
            sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
            sb.Append(" tb_orcamento.valor_total_produto, tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
            sb.Append(" tb_orcamento.id_usuario_checkin, tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
            sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.nome AS nome_empresa , tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento");
            sb.Append(" FROM         tb_orcamento INNER JOIN ");
            sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
            sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
            sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
            sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
            sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
            sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");

           if (Where != string.Empty)
            {
                db.CreateParameter("@Where", SqlDbType.VarChar, Where);
                sb.Append(string.Format(" Where  {0}",Where));
            }

            if (OrderBy != string.Empty)
            {
                db.CreateParameter("@OrderBy", SqlDbType.VarChar, OrderBy);
                sb.Append(string.Format(" Order By {0}", OrderBy));
            }

            ds = db.ExecuteQuery(sb.ToString());
            return ds;
        }		
		
		public DataSet Selecionar()
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();

            sb.Append("SELECT     tb_orcamento.id, tb_orcamento.id_empresa, tb_orcamento.id_cadastro, tb_orcamento.id_forma_pagamento, tb_orcamento.veiculo_placa, tb_orcamento.veiculo_km, tb_orcamento.id_condicao_pagamento, ");
            sb.Append(" tb_orcamento.dt_emissao, tb_orcamento.dt_entrega, tb_orcamento.dt_aprovacao, tb_orcamento.dt_validade, tb_orcamento.hora_emissao, tb_orcamento.id_operacao, ");
            sb.Append(" tb_orcamento.id_situacao_orcamento, tb_orcamento.observacao, tb_orcamento.informacao_adicional, tb_orcamento.valor_total_servico, ");
            sb.Append(" tb_orcamento.valor_total_produto,  tb_orcamento.valor_total_desconto, tb_orcamento.valor_total_outro,  tb_orcamento.valor_total_orcamento,  ");
            sb.Append(" tb_orcamento.id_usuario_checkin , tb_orcamento.id_usuario_criador, tb_orcamento.dt_checkin, tb_condicao_pagamento.desc_condicao_pagamento,  ");
            sb.Append(" tb_cadastro.nome AS nome_cliente_fornecedor, tb_forma_pagamento.desc_forma_pagamento, tb_empresa.nome AS nome_empresa, tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento ");
            sb.Append(" FROM         tb_orcamento INNER JOIN ");
            sb.Append("           tb_cadastro ON tb_orcamento.id_cadastro = tb_cadastro.id INNER JOIN ");
            sb.Append("                      tb_condicao_pagamento ON tb_orcamento.id_condicao_pagamento = tb_condicao_pagamento.id INNER JOIN ");
            sb.Append(" tb_forma_pagamento ON tb_orcamento.id_forma_pagamento = tb_forma_pagamento.id INNER JOIN ");
            sb.Append(" tb_orcamento_operacao ON tb_orcamento.id_operacao = tb_orcamento_operacao.id INNER JOIN ");
            sb.Append(" tb_empresa ON tb_orcamento.id_empresa = tb_empresa.id INNER JOIN");
            sb.Append(" tb_tipo_situacao_orcamento ON tb_orcamento.id_situacao_orcamento = tb_tipo_situacao_orcamento.id");

            sb.Append(" Order By tb_orcamento.id");            
            ds = db.ExecuteQuery(sb.ToString());
            return ds;
        }		
		
		
		public DataSet ListaCampos()
        {

            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            sb.Append("SELECT TABLE_NAME, ORDINAL_POSITION, ");
            sb.Append(" COLUMN_NAME, DATA_TYPE, IS_NULLABLE ");
            sb.Append(" FROM INFORMATION_SCHEMA.COLUMNS");
            sb.Append(" WHERE TABLE_NAME = 'tb_orcamento'");
            ds = db.ExecuteQuery(sb.ToString());

            return ds;

        }

		public DataSet DropdownList()
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
			sb.Append("SELECT ");
			sb.Append(" id ");
				sb.Append(", id_empresa ");  				
				sb.Append(", id_cadastro ");  				
				sb.Append(", id_forma_pagamento ");  				
			sb.Append(" FROM tb_orcamento ");           
			sb.Append(" ORDER BY id_empresa ");
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_ORCAMENTO_DROPDOWNLIST");  
            return ds;
        }

        public DataSet DropdownList(String Where)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            db.CreateParameter("@Where", SqlDbType.VarChar, Where);
			sb.Append("SELECT ");
			sb.Append(" id ");
			
			
			sb.Append(", id_empresa ");  				
			
			
			sb.Append(", id_cadastro ");  				
			
			
			sb.Append(", id_forma_pagamento ");  				
			sb.Append(" FROM tb_orcamento ");
			sb.Append(string.Format(" WHERE {0} ",Where));
			sb.Append(" ORDER BY id_empresa ");
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_ORCAMENTO_DROPDOWNLIST");
            return ds;
        }
		
		  public DataSet DropdownList(String Where, String OrderBy)
        {
            DAO_DATABASE db = new DAO_DATABASE();
            DataSet ds = new DataSet();
            StringBuilder sb = new StringBuilder();
            db.CreateParameter("@Where", SqlDbType.VarChar, Where);
			sb.Append("SELECT ");
			sb.Append(" id ");
			sb.Append(", id_empresa ");  				
			sb.Append(", id_cadastro ");  				
			sb.Append(", id_forma_pagamento ");  				
			sb.Append(" FROM tb_orcamento ");
			sb.Append(string.Format(" WHERE {0} ORDER BY {1}",Where,OrderBy));			
            ds = db.ExecuteQuery(sb.ToString());

            // ds = db.ExecuteProcedure("USP_TB_ORCAMENTO_DROPDOWNLIST");
            return ds;
        }

          public DataTable CriarDataTable()
          {
              DataTable table = new DataTable();
              table.Columns.Add("ID", typeof(int));
              table.Columns.Add("EMPRESA", typeof(string));
              table.Columns.Add("ID_CADASTRO", typeof(int));
              table.Columns.Add("NOME", typeof(string));
              table.Columns.Add("CNPJ_CPF", typeof(string));
              table.Columns.Add("FORMA_PAGAMENTO", typeof(string));
              table.Columns.Add("CONDICAO_PAGAMENTO", typeof(string));
              table.Columns.Add("DT_ENTREGA", typeof(DateTime));
              table.Columns.Add("DT_EMISSAO", typeof(DateTime));
              table.Columns.Add("DT_VALIDADE", typeof(DateTime));
              table.Columns.Add("DT_APROVACAO", typeof(DateTime));
              table.Columns.Add("DT_HORA_EMISSAO", typeof(DateTime));
              table.Columns.Add("VLR_TOT_DESCONTO", typeof(decimal));
              table.Columns.Add("VLR_TOT_OUTRO", typeof(decimal));              
              table.Columns.Add("VLR_TOT_PRODUTO", typeof(decimal));
              table.Columns.Add("VLR_TOT_SERVICO", typeof(decimal));
              table.Columns.Add("VLR_TOT_ORCAMENTO", typeof(decimal));
              table.Columns.Add("SIT_ORCAMENTO", typeof(string));


              return table;
          }

          public DataTable PreencheDataTable(DataTable dt, OBJ_TB_ORCAMENTO obj)
          {
              DataRow dr = dt.NewRow();
              dr["ID"] = obj.id.ToString();
              dr["EMPRESA"] = obj.Tb_empresa.nome.ToString();
              dr["ID_CADASTRO"] = obj.id_cadastro;
              dr["NOME"] = obj.Tb_cadastro.nome.ToString();
              dr["CNPJ_CPF"] = obj.Tb_cadastro.cnpj_cpf.ToString();
              dr["FORMA_PAGAMENTO"] = obj.Tb_forma_pagamento.desc_forma_pagamento.ToString();
              dr["CONDICAO_PAGAMENTO"] = obj.Tb_condicao_pagamento.desc_condicao_pagamento.ToString();              
              dr["DT_ENTREGA"] = obj.dt_entrega;
              dr["DT_EMISSAO"] = obj.dt_emissao;
              dr["DT_VALIDADE"] = obj.dt_validade;
              dr["DT_APROVACAO"] = obj.dt_aprovacao;
              dr["DT_HORA_EMISSAO"] = obj.hora_emissao;              
              dr["VLR_TOT_DESCONTO"] = obj.valor_total_desconto;              
              dr["VLR_TOT_OUTRO"] = obj.valor_total_outro;
              dr["VLR_TOT_PRODUTO"] = obj.valor_total_produto;
              dr["VLR_TOT_SERVICO"] = obj.valor_total_servico;
              dr["VLR_TOT_ORCAMENTO"] = obj.valor_total_orcamento;
              dr["SIT_ORCAMENTO"] = obj.Tb_tipo_situacao_orcamento.desc_tipo_sit_orcamento.ToString();
              dt.Rows.Add(dr);
              return dt;

          }

          public void SerializeLista(List<OBJ_TB_ORCAMENTO> obj, string arquivo)
          {

              try
              {
                  // C#
                  // Create file to save the data to
                  FileStream fs = new FileStream(arquivo, FileMode.Create);
                  // Create an XmlSerializer object to perform the serialization
                  XmlSerializer xs = new XmlSerializer(typeof(List<OBJ_TB_ORCAMENTO>));
                  // Use the XmlSerializer object to serialize the data to the file
                  xs.Serialize(fs, obj);
                  // Close the file
                  fs.Close();
              }
              catch (Exception)
              {

                  throw;
              }



          }


          public List<OBJ_TB_ORCAMENTO> DeserializeLista(string arquivo)
          {
              try
              {
                  // C#
                  // Open file to read the data from
                  FileStream fs = new FileStream(arquivo, FileMode.Open);
                  // Create an XmlSerializer object to perform the deserialization
                  XmlSerializer xs = new XmlSerializer(typeof(List<OBJ_TB_ORCAMENTO>));
                  // Use the XmlSerializer object to deserialize the data from the file
                  List<OBJ_TB_ORCAMENTO> obj = (List<OBJ_TB_ORCAMENTO>)xs.Deserialize(fs);
                  // Close the file
                  fs.Close();

                  return obj;

              }
              catch (Exception)
              {

                  throw;
              }

          }


          public void SerializeObjeto(OBJ_TB_ORCAMENTO obj, string arquivo)
          {

              try
              {
                  // C#
                  // Create file to save the data to
                  FileStream fs = new FileStream(arquivo, FileMode.Create);
                  // Create an XmlSerializer object to perform the serialization
                  XmlSerializer xs = new XmlSerializer(typeof(OBJ_TB_ORCAMENTO));
                  // Use the XmlSerializer object to serialize the data to the file
                  xs.Serialize(fs, obj);
                  // Close the file
                  fs.Close();
              }
              catch (Exception)
              {

                  throw;
              }



          }


          public OBJ_TB_ORCAMENTO DeserializeObjeto(string arquivo)
          {
              try
              {
                  // C#
                  // Open file to read the data from
                  FileStream fs = new FileStream(arquivo, FileMode.Open);
                  // Create an XmlSerializer object to perform the deserialization
                  XmlSerializer xs = new XmlSerializer(typeof(OBJ_TB_ORCAMENTO));
                  // Use the XmlSerializer object to deserialize the data from the file
                  OBJ_TB_ORCAMENTO obj = (OBJ_TB_ORCAMENTO)xs.Deserialize(fs);
                  // Close the file
                  fs.Close();

                  return obj;

              }
              catch (Exception)
              {

                  throw;
              }

          }

	}
	#endregion
}

